package com.ljy.java_practice.nowcoder.a.a8.a8_8;




/**
 * 1.题目地址：https://ac.nowcoder.com/acm/problem/22230
 * （1）题目描述：给你一个整数n，按要求输出n∗n的回型矩阵
 * （2）输入描述：输入一行，包含一个整数n。1<=n<=19
 * （3）输出描述：输出n行，每行包含n个正整数.
 * （4）例如：
 * a.示例1
 * 输入：
 4
 * 输出：
 1 2 3 4
 12 13 14 5
 11 16 15 6
 10 9 8 7

 * 2.思路分析
 *（1）按照上、右、下、左以顺时针画矩阵。第一圈走最外围，第二圈走第二个外围，以此类推。
 第一圈：
 画上线的时候，y不变，x逐次加一
 画右线的时候，x不变，y逐次加一
 画下线的时候，y不变，x逐次减一
 画左线的时候，x不变，y逐次减一
 （2）最大圈数的界定
 int round= (n%2==1) ? n/2+1: n/2;//表示要划几圈。如果有余数，则表示n是奇数，要循环n/2+1次；
 （3）每一圈初始位置的界定
 以对角线走，每圈的初始位置都是x+1，y+1。
 （4）如果n是奇数，那么最后一圈一个数（原点）；如果n是偶数，那么最后一圈是循环走4个数



 *
 * 3.运行结果
 * 通过
 *
 */

import java.io.IOException;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()){
            int n=sc.nextInt();//整数n
            if(n>=1&&n<=19) {
                int round= (n%2==1) ? n/2+1: n/2;//表示要划几圈。如果有余数，则表示n是奇数，要循环n/2+1次；
                int runRound=1;//默认第一圈
                int m=1;//计数
                int i,j;//二维数组的行坐标和列坐标
                int[][] arrays=new int[n][n];
                while(runRound<=round){//只要圈没划完
                    i=j=runRound-1;//每圈开始时二维数组的初始坐标
                    if(runRound==round&&n%2==1){//如果是最后一圈并且圈数是基数，说明最后一圈只有最中间一个点有值
                        arrays[i][j]=m++;
                    }else{//如果是正常走圈
                        while(j<n-(runRound-1)){//画回文的上边
                            arrays[i][j]=m++;
                            if(j==n-(runRound-1)-1){//最后一次循环时，让j停留在数组最后一列
                                break;
                            }else{
                                j++;
                            }
                        }
                        for(i=n-j;i<n-(runRound-1);i++){//画回文的右边
                            arrays[i][j]=m++;
                            if(i==n-(runRound-1)-1){//最后一次循环时，让i停留在本圈的数组最后一行
                                break;
                            }
                        }
                        for(j=i-1;j>=runRound-1;j--){//画回文的下边
                            arrays[i][j]=m++;
                            if(j==(runRound-1)){//最后一次循环时，让i停留在本圈的数组最后一行
                                break;
                            }
                        }
                        for(i=n-j-2;i>=1+(runRound-1);i--){//画回文的左边
                            arrays[i][j]=m++;
                            if(i==1+(runRound-1)){//最后一次循环时，让i停留在本圈的数组最后一行
                                break;
                            }
                        }
                    }
                    runRound++;//让圈数+1
                }
                //输出数组
                for(i=0;i<n;i++){
                    for(j=0;j<n;j++){
                        System.out.print(arrays[i][j]+" ");
                    }
                    System.out.println();
                }
            }
        }
    }
}
